package com.fjw.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

/**
 * 文件上传下载控制器
 * 处理PDF文件上传、路径获取及输出流响应等功能
 */
@RestController
@RequestMapping("/picture")
public class UploadController {

    /**
     * PDF文件上传接口
     * @param file 上传的文件对象
     * @param req HTTP请求对象
     * @return 上传结果（文件路径或错误信息）
     * @throws FileNotFoundException 文件未找到异常
     * @throws UnsupportedEncodingException 编码不支持异常
     */
    @PostMapping("/upload")
    public String fileupload(MultipartFile file, HttpServletRequest req)
            throws FileNotFoundException, UnsupportedEncodingException {
        String originName = file.getOriginalFilename();

        // 文件格式校验：仅允许PDF格式
        if (!originName.endsWith(".pdf")) {
            return "文件格式错误，仅支持PDF";
        }

        // 获取静态资源存储路径（基于类路径的static目录）
        String realPath = ResourceUtils.getURL("classpath:").getPath() + "static/";
        realPath = URLDecoder.decode(realPath, "utf-8"); // 解码路径中的特殊字符

        // 创建存储目录（若不存在则自动创建）
        File folder = new File(realPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }

        // 生成唯一文件名（UUID+后缀）
        String newName = UUID.randomUUID().toString() + ".pdf";

        try {
            // 保存文件到指定目录
            file.transferTo(new File(folder, newName));

            // 构建并返回文件访问路径（去除target/classes层级）
            String url = realPath + newName;
            String str1 = url.substring(0, url.indexOf("/target/classes/static/"));
            String splicedURL = url.substring(str1.length() + 1, url.length());
            return splicedURL;

        } catch (IOException e) {
            System.out.println("文件上传失败：" + e.getMessage());
            return "未知错误";
        }
    }

    /**
     * 获取当前项目路径接口
     * @return 当前项目根路径
     */
    @GetMapping("/getCurrentPath")
    public String getCurrentPath() {
        return System.getProperty("user.dir"); // 返回项目启动时的工作目录
    }

    /**
     * 输出本地文件流接口（PDF文件预览或下载）
     * @param path 文件路径（需包含文件名）
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @throws Exception 通用异常处理
     */
    @GetMapping("/outPut")
    public void outPutLocal(String path, HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("请求文件路径：" + path);

        // 处理路径中的斜杠（兼容不同操作系统）
        File file = new File(path);

        if (!file.exists()) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 设置响应头（强制下载或预览）
        response.setContentType("application/pdf;charset=UTF-8");
        response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); // inline为预览，attachment为下载

        try (FileInputStream is = new FileInputStream(file);
             OutputStream out = response.getOutputStream()) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            out.flush();

        } catch (IOException e) {
            System.out.println("文件输出失败：" + e.getMessage());
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
}